﻿using Prism.Ioc;
using Prism.Mvvm;
using Prism.Unity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Zhy.PrismViewModelLocator.ViewModels;
using Zhy.PrismViewModelLocator.Views;

namespace Zhy.PrismLesson
{
    public class Startup : PrismBootstrapper
    {
        /// <summary>
        /// 提供主窗口对象的方法
        /// </summary>
        /// <returns></returns>
        protected override DependencyObject CreateShell()
        {
            // 方式二  简化写法
            //return Container.Resolve<MainWindow>();
            return Container.Resolve<LoginView>();
        }

        /// <summary>
        /// 其它窗口注入的方法
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            
        }

        /// <summary>
        /// ViewModel 自定义匹配
        /// 处理View与ViewModel之间的关系
        /// 如果默认的view与ViewModel匹配规则不太合适，可以修改。
        /// </summary>
        protected override void ConfigureViewModelLocator()
        {
            base.ConfigureViewModelLocator();

            // 1、自定义默认的View与ViewModel匹配规则
            ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(TypeResolver);

            // 2、明确指定特定View与ViewModel关系
            ViewModelLocationProvider.Register<MainWindow, MainWindowViewModel>();
            // 3、明确指定特定View与ViewModel关系 - 使用文本的方式注册
            ViewModelLocationProvider.Register("MainWindow", typeof(MainWindowViewModel));
            // 4、明确指定特定View与ViewModel关系 - 使用委托的方式注册
            ViewModelLocationProvider.Register("MainWindow", new Func<object>(CreateMainViewModel));
            // 4、明确指定特定View与ViewModel关系 - 使用委托的方式注册
            ViewModelLocationProvider.Register("MainWindow", new Func<object>(CreateMainViewModel2));
            // 5、明确指定特定View与ViewModel关系 - 使用委托的方式注册-使用了泛型
            ViewModelLocationProvider.Register<MainWindow>(CreateMainViewModel);


        }

        /// <summary>
        /// 委托方法-返回一个注册对象
        /// </summary>
        /// <returns></returns>
        private object CreateMainViewModel() => Container.Resolve<MainWindowViewModel>(); // 这种方式还可以解析注册信息
        /// <summary>
        /// 委托方法-返回一个注册对象
        /// </summary>
        /// <returns></returns>
        private object CreateMainViewModel2() => new MainWindowViewModel();

        /// <summary>
        /// 自定义view与ViewModel匹配规则
        /// 基本上不会去改这个默认的匹配规则
        /// </summary>
        /// <param name="view_type">页面对象</param>
        /// <returns></returns>
        private Type TypeResolver(Type view_type)
        {
            //Zhaoxi.PrismViewModelLocator.Views.MainWindow
            //Zhaoxi.PrismViewModelLocator.ViewModels.MainWindowViewModel
            //Zhaoxi.PrismViewModelLocator.ViewModels.MainWindowViewModel

            // Prism自动关联ViewModel的默认规则：
            // View的类名称非View结尾的时候，解析ViewModel的类名称时候，后面需要加上ViewModel
            // View的类名称以View结尾的时候，解析ViewModel的类名称时候，后面只需要加上Model

            // 把.Views.替换成.ViewModels.
            var vmName = view_type.FullName.Replace(".Views.", ".ViewModels.");

            if (vmName.EndsWith("View")) // 如果以View结尾
                vmName += "Model";
            else
                vmName += "ViewModel";

            return Type.GetType(vmName);
        }
    }
}
